home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1997-01-31 | 21.0 KB | 768 lines |
- 10 'LOCALRPT - 03 JUN 94 rev. 31 JAN 97
- 20 IF EX$=""THEN EX$="EXIT"
- 30 PROG$="localrpt"
- 40 COMMON EX$,PROG$
- 50 IF POSN THEN 670
- 60 ON ERROR GOTO 510
- 70 CLS:KEY OFF
- 80 COLOR 7,0,1
- 90 DIM A$(511,7),F$(26,2)
- 100 DIM B$(511)
- 110 U1$="#####.#"
- 120 U2$="##,###.#"
- 130 U3$="####.#"
- 140 U4$="####,###.#"
- 150 U5$="###.#"
- 160 U6$="#####"
- 170 U7$="####"
- 180 U8$="######"
- 190 UL$=STRING$(80,205)
- 200 XX$=STRING$(79,32) 'blank
- 210 PI=3.14159
- 220 GOTO 300
- 230 '
- 240 '.....sorting notice
- 250 W$=" S O R T I N G ..........Please Wait......"
- 260 CLS:LOCATE 12,(80-LEN(W$))/2:COLOR 15,1
- 270 PRINT W$
- 280 RETURN
- 290 '
- 300 '.....start
- 310 CLS:POSN=0
- 320 PRINT " LOCAL REPEATERS"
- 330 PRINT UL$;
- 340 GOSUB 7450 'preface
- 350 PRINT UL$;
- 360 PRINT " Press number in < > to choose standard unit of measure:"
- 370 PRINT UL$;
- 380 PRINT " < 1 > Metric"
- 390 PRINT " < 2 > U.S.A./Imperial"
- 400 PRINT UL$;
- 410 PRINT " or Press < 0 > to EXIT....."
- 420 Z$=INKEY$
- 430 IF Z$="0"THEN CLS:RUN EX$
- 440 IF Z$="1"THEN UM=1:UM$="Km.":GOTO 470
- 450 IF Z$="2"THEN UM=1.60933:UM$="mi.":GOTO 470
- 460 GOTO 420
- 470 GOSUB 240 'sorting notice
- 480 COLOR 7,0
- 490 GOTO 560
- 500 '
- 510 '.....error trap
- 520 PRINT "Error";ERR;"in line";ERL;"...Press any key to start over..."
- 530 IF INKEY$=""THEN 530
- 540 GOTO 10
- 550 '
- 560 '.....load data
- 570 N=0
- 580 OPEN "I",1,"\data\index\rptrdex.fil"
- 590 IF EOF(1) THEN 650
- 600 N=N+1
- 610 FOR Y=1 TO 7
- 620 INPUT# 1,A$(N,Y)
- 630 NEXT Y
- 640 GOTO 590
- 650 CLOSE
- 660 '
- 670 '.....display
- 680 CLS
- 690 COLOR 15,2
- 700 PRINT " LOCAL REPEATERS";
- 710 PRINT TAB(57);"by George Murphy VE3ERP ";
- 720 COLOR 1,0:PRINT STRING$(80,223);
- 730 COLOR 7,0
- 740 IF POSN THEN Z=POSN:GOSUB 1140:GOTO 980
- 750 '
- 760 GOSUB 2300 'text
- 770 PRINT UL$;
- 780 PRINT " Press number in < > to:"
- 790 PRINT UL$;
- 800 PRINT " < 1 > VIEW/EDIT/SEARCH List of Local Repeaters"
- 810 PRINT " < 2 > LIST repeaters within a SPECIFIED RANGE of any base station"
- 820 PRINT " < 3 > LOCATE a repeater on a RADAR SCREEN centred on any location"
- 830 PRINT " < 4 > Convert Degrees/Minutes/Seconds to Decimal Degrees"
- 840 Z$=INKEY$
- 850 IF Z$="1"THEN 3300 'data base program
- 860 IF Z$="2"THEN FAR$="k":GOTO 6450 'repeater range
- 870 IF Z$="3"THEN FAR$="k":GOTO 910 'far$=k=kilometres
- 880 IF Z$="4"THEN CLS:CHAIN"equiv"
- 890 GOTO 840
- 900 '
- 910 '.....inputs
- 920 VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
- 930 LA(1)=0:LA(2)=0:LO(1)=0:LO(2)=0
- 940 STN=0
- 950 STN$(1)=" HOME "
- 960 STN$(2)=" REPEATER "
- 970 '
- 980 STN=STN+1
- 990 IF POSN THEN ZZ=POSN ELSE ZZ=1
- 1000 IF POSN<>1 THEN 1030
- 1010 GOSUB 1110
- 1020 '
- 1030 FOR Z=ZZ TO 2 '********** start input loop **********
- 1040 DOT$=STRING$(39-LEN(P$(Z)),".")
- 1050 IF POSN=Z THEN GOSUB 1110:GOTO 1180
- 1060 IF(P$(Z)<>"" AND LA(Z)*LO(Z))THEN 1180
- 1070 PRINT " Press any key to select";STN$(STN);"station.................."
- 1080 IF INKEY$=""THEN 1080
- 1090 POSN=Z:GOTO 3300 'data base program
- 1100 '
- 1110 '.....format latitude & longitude
- 1120 IF SGN(LA(Z))=-1 THEN NS$(Z)="<UNK! {00F8}>S"ELSE NS$(Z)="<UNK! {00F8}>N"
- 1130 IF SGN(LO(Z))=-1 THEN EW$(Z)="<UNK! {00F8}>W"ELSE EW$(Z)="<UNK! {00F8}>E"
- 1140 RLA(Z)=LA(Z)*PI/180 'latitude in radians
- 1150 RLO(Z)=LO(Z)*PI/180 'longitude in radians
- 1160 RETURN
- 1170 '
- 1180 NEXT Z '********** end input loop **********
- 1190 '
- 1200 ROUTE=SGN(LA(1)+LA(2)) 'determine north or south route
- 1210 IF LA(1)<0 AND LA(2)<0 THEN ROUTE=1 'A & B both in southern hemisphere
- 1220 '
- 1230 '.....display initial data
- 1240 VIEW PRINT 3 TO 23:CLS:VIEW PRINT 'erase screen
- 1250 LOCATE 3
- 1260 Z=1:GOSUB 1110
- 1270 HOME$=P$(1)
- 1280 PRINT TAB(2);"HOME QTH:";
- 1290 DOT$=STRING$(47-LEN(P$(1)),".")
- 1300 PRINT TAB(12);P$(1);" ";DOT$;
- 1310 PRINT TAB(61);USING U1$;ABS(LA(1));
- 1320 PRINT NS$(1);USING U1$;ABS(LO(1));
- 1330 PRINT EW$(1);
- 1340 Z=2:GOSUB 1110
- 1350 PRINT TAB(2);"AWAY QTH:";
- 1360 DOT$=STRING$(47-LEN(P$(2)),".")
- 1370 PRINT TAB(12);P$(2);" ";DOT$;
- 1380 PRINT TAB(61);USING U1$;ABS(LA(2));
- 1390 PRINT NS$(2);USING U1$;ABS(LO(2));
- 1400 PRINT EW$(2)
- 1410 GOSUB 1510 'to make B > A
- 1420 MERID=0 'default value
- 1430 IF LO(1)=LO(2)THEN MERID=1:GOTO 1480 'A & B on same meridian
- 1440 IF ABS(LO(1))+ABS(LO(2))<>180 THEN 1480
- 1450 LA(2)=180-LA(2):MERID=1 'A & B on opposite meridians
- 1460 IF LA(2)>180 THEN LA(2)=LA(2)-90
- 1470 RLA(2)=LA(2)*PI/180 'angle in radians
- 1480 GOSUB 2630 'calculation sub-routine
- 1490 GOTO 1610 'screen print
- 1500 '
- 1510 '.....point B must be place of greater latitude
- 1520 ALA=RLA(1):BLA=RLA(2)
- 1530 IF(ALA=BLA)AND(RLO(1)>RLO(2))THEN 1560 'both on equator
- 1540 IF (ALA<0)AND(BLA<0)THEN ALA=ABS(ALA):BLA=ABS(BLA) 'both south of equator
- 1550 IF BLA>ALA THEN 1590
- 1560 SWAP RLA(1),RLA(2)
- 1570 SWAP RLO(1),RLO(2)
- 1580 SWAP P$(1),P$(2)
- 1590 RETURN
- 1600 '
- 1610 '.....display balance of data
- 1620 LONDIFF=ABS(LO(1)-LO(2)) 'difference in longitude
- 1630 IF LONDIFF >180 THEN LONDIFF=360-LONDIFF
- 1640 ZONE=LONDIFF/15 'no. of 1 hr.time zones
- 1650 MIN=INT((ZONE)*60) 'minutes
- 1660 SEC=(ZONE*60-MIN)*60 'seconds
- 1670 T=12 'tab
- 1680 KM=ZD*4*10^4/360
- 1690 MI=KM/1.60935
- 1700 PRINT TAB(T);"Great Circle distance";STRING$(27,".");USING U8$;KM;
- 1710 PRINT " km=";USING U6$;MI;:PRINT " mi."
- 1720 PRINT TAB(T);"Solar Time difference";STRING$(27,".");USING U8$;MIN;
- 1730 PRINT " min.";USING U7$;SEC;:PRINT " sec.";
- 1740 D1$=STRING$(35-LEN(P$(1)),".")
- 1750 PRINT TAB(T);"Bearing from ";P$(1);D1$;TAB(63);USING U5$;XD;:PRINT "<UNK! {00F8}>"
- 1760 IF P$(1)=HOME$ THEN BRG=XD
- 1770 D2$=STRING$(35-LEN(P$(2)),".")
- 1780 PRINT TAB(T);"Bearing from ";P$(2);D2$;TAB(63);USING U5$;YD;:PRINT "<UNK! {00F8}>"
- 1790 IF P$(2)=HOME$ THEN BRG=YD
- 1800 PRINT UL$;
- 1810 '
- 1820 PRINT " BEARINGS ARE"
- 1830 PRINT " FROM TRUE NORTH"
- 1840 PRINT " THENTHENTHENTHENTHENTHENTHENTHENTHENTHENTHENTHENTHENTHENTHEN
- 1850 PRINT " ";
- 1860 COLOR 15,1
- 1870 PRINT "<*>";
- 1880 COLOR 7,0
- 1890 PRINT " = ";RPT$
- 1900 PRINT " Output: ";XMT$
- 1910 PRINT " Offset: ";SET$
- 1920 PRINT " Input: ";RCV$
- 1930 PRINT " THENTHENTHENTHENTHENTHENTHENTHENTHENTHENTHENTHENTHENTHENTHEN
- 1940 R=7 'radial
- 1950 H=R^2/2 '1/2 square of hypotenuse
- 1960 X=41 'x-axis
- 1970 Y=17 'y-axis
- 1980 XY=2.34375 'xy ratio
- 1990 FOR Z=Y-R TO Y+R
- 2000 LOCATE Z,X-18
- 2010 PRINT STRING$(37,"CSRLIN");
- 2020 IF Z<Y+R THEN PRINT ""
- 2030 NEXT Z
- 2040 COLOR 15,3
- 2050 LOCATE Y-R,X-2:PRINT " N "
- 2060 LOCATE Y-SQR(H),X-(SQR(H)*XY)-1.5:PRINT " NW "
- 2070 LOCATE Y-SQR(H),X+(SQR(H)*XY)-1.5:PRINT " NE "
- 2080 LOCATE Y,X-(R*XY)-2:PRINT " W "
- 2090 COLOR 15,1
- 2100 LOCATE Y,X-3:PRINT " HO*ME "
- 2110 COLOR 15,3
- 2120 LOCATE Y,X+(R*XY)-2:PRINT " E "
- 2130 LOCATE Y+SQR(H),X-(SQR(H)*XY)-1.5:PRINT " SW "
- 2140 LOCATE Y+SQR(H),X+(SQR(H)*XY)-1.5:PRINT " SE "
- 2150 LOCATE Y+R,X-2:PRINT " S ";
- 2160 '....BRG = bearing from home station
- 2170 BRG=BRG-90 'bearing in degrees
- 2180 HDG=BRG*3.14159/180 'bearing in radians
- 2190 YY=SIN(HDG)*R
- 2200 XX=COS(HDG)*R*XY
- 2210 COLOR 15,1
- 2220 LOCATE Y+YY,X+XX-1
- 2230 PRINT "<*>";
- 2240 LOCATE Y+YY/2,INT(X+XX/2-3)
- 2250 COLOR 15,0
- 2260 PRINT CINT(KM/UM);UM$
- 2270 COLOR 7,0:GOSUB 7550
- 2280 GOTO 300 'start
- 2290 '
- 2300 '.....text
- 2310 TB=7
- 2320 PRINT TAB(TB);
- 2330 PRINT " When you first run this program, add your own station to the"
- 2340 PRINT TAB(TB);
- 2350 PRINT "data base, listing your output as 0 Mhz and your offset as +0 Khz."
- 2360 PRINT TAB(TB);
- 2370 PRINT "Enter your latitude and longitude, which you can determine from a"
- 2380 PRINT TAB(TB);
- 2390 PRINT "good road map or atlas. Enter these in decimal degrees, to the"
- 2400 PRINT TAB(TB);
- 2410 PRINT "nearest 0.1 degree."
- 2420 PRINT TAB(TB);
- 2430 PRINT " You can then add your local repeaters, and delete any that are"
- 2440 PRINT TAB(TB);
- 2450 PRINT "in the data base but are of no interest to you. I left a sample"
- 2460 PRINT TAB(TB);
- 2470 PRINT "list of repeaters and my own station (VE3ERP) as Home Station in"
- 2480 PRINT TAB(TB);
- 2490 PRINT "the data base so first-time users of this program can fool around"
- 2500 PRINT TAB(TB);
- 2510 PRINT "with it before entering their own data."
- 2520 PRINT TAB(TB);
- 2530 PRINT " The data base can be edited at any time to add, delete or change"
- 2540 PRINT TAB(TB);
- 2550 PRINT "any listings."
- 2560 PRINT
- 2570 PRINT TAB(TB);
- 2580 PRINT " ......73 de VE3ERP......"
- 2590 RETURN
- 2600 '
- 2610 '**********SUB-ROUTINES**********
- 2620 '
- 2630 '.....calculate bearings and distance
- 2640 REM RLA(n) & RLO(n) are LAT & LONG inputs in radians
- 2650 LB=RLA(2) 'latitude of point B in radians
- 2660 LA=RLA(1) 'latitude of point A in radians
- 2670 IF LA=0 AND LB=0 THEN 2860 'both points on equator
- 2680 C=RLO(1)-RLO(2) 'difference in longitude
- 2690 IF C=0 THEN 2730 'both points on same meridian
- 2700 IF ABS(C)=PI THEN 2790 'points on opposite meridian
- 2710 GOTO 2950
- 2720 '
- 2730 '.....A & B both on same meridian
- 2740 ZR=LB-LA:ZD=ZR*180/PI
- 2750 Y=PI:YD=180
- 2760 X=0:XD=0
- 2770 RETURN
- 2780 '
- 2790 '.....A & B on opposite meridians
- 2800 ZR=LB-LA:IF ZR>PI THEN ZR=2*PI-ZR
- 2810 IF ZR<PI THEN Y=0:YD=0:X=0:XD=0
- 2820 IF ZR>PI THEN Y=PI:YD=180:X=PI:XD=180
- 2830 ZD=ZR*180/PI
- 2840 RETURN
- 2850 '
- 2860 '.....A & B both on equator
- 2870 EQUAT=1 'flag
- 2880 Y=PI/2:YD=Y*180/PI
- 2890 X=1.5*PI:XD=X*180/PI
- 2900 L=ABS(RLO(1)-RLO(2))
- 2910 IF L>PI THEN L=2*PI-L
- 2920 ZR=L:ZD=ZR*180/PI
- 2930 GOTO 3110
- 2940 '
- 2950 '.....formula elements
- 2960 F0=1/TAN(C/2) 'cotangent C/2
- 2970 F1=F0*SIN((LB-LA)/2)/COS((LB+LA)/2)
- 2980 IF LB+LA=0 THEN F2=F0*COS((LB-LA)/2)/SIN(9.8E-08):GOTO 3000
- 2990 F2=F0*COS((LB-LA)/2)/SIN((LB+LA)/2)
- 3000 F3=ATN(F1)
- 3010 F4=ATN(F2)
- 3020 '
- 3030 '.....bearings
- 3040 Y=F4+F3 'bearing at point B
- 3050 IF LA<0 AND LB<0 THEN Y=Y+PI:GOTO 3070 'A & B both in southern hemisphere
- 3060 IF ABS(LA)>ABS(LB)THEN Y=Y+PI
- 3070 IF Y<0 THEN Y=Y+2*PI
- 3080 IF Y>=(2*PI)THEN Y=Y-2*PI
- 3090 YD=Y*180/PI 'bearing in degrees at point B
- 3100 '
- 3110 X=F4-F3 'bearing at point A
- 3120 IF LA<0 AND LB<0 THEN X=X+PI:GOTO 3140 'A & B both in southern hemisphere
- 3130 IF ABS(LA)>ABS(LB)THEN X=X+PI
- 3140 IF X<0 THEN X=X+2*PI
- 3150 IF X>=(2*PI)THEN X=X-2*PI
- 3160 XR=2*PI-X 'reciprocal
- 3170 IF XR<0 THEN XR=XR+2*PI
- 3180 IF XR>=(2*PI)THEN XR=XR-2*PI
- 3190 XD=XR*180/PI 'bearing in degrees at point A
- 3200 '
- 3210 '.....distance
- 3220 IF RLO(1)=RLO(2)THEN ZR=ABS(LB-LA):GOTO 3260
- 3230 IF LA=LB THEN LB=LB+9.8E-08:GOTO 2680 'avoids trig function of angle 0
- 3240 F5=TAN((LB-LA)/2)*SIN(F4)/SIN(F3) 'F5=tan ZR/2 (ZR=distance angle)
- 3250 ZR=ABS(2*ATN(F5)) 'distance angle in radians
- 3260 ZD=ZR*180/PI 'distance angle in degrees
- 3270 '
- 3280 RETURN
- 3290 '
- 3300 '.....data base program
- 3310 CLS
- 3320 IF FAR$<>""THEN 4950
- 3330 COLOR 15,2
- 3340 PRINT " LOCAL REPEATERS "
- 3350 COLOR 1,0:PRINT STRING$(80,223);
- 3360 COLOR 7,0
- 3370 PRINT " Press number in < > to:"
- 3380 PRINT UL$;
- 3390 PRINT " < 1 > ADD a listing"
- 3400 PRINT " < 2 > FIND/EDIT a listing"
- 3410 PRINT " < 3 > DISPLAY listings"
- 3420 Z$=INKEY$
- 3430 IF Z$="1"THEN CLS:GOTO 4030
- 3440 IF Z$="2"THEN CLS:GOTO 4950
- 3450 IF Z$="3"THEN GOSUB 4150:GOTO 4450
- 3460 GOTO 3420
- 3470 '
- 3480 '.....save data
- 3490 OPEN "O",1,"\data\index\rptrdex.fil"
- 3500 FOR Z=1 TO N
- 3510 WRITE# 1,A$(Z,1),A$(Z,2),A$(Z,3),A$(Z,4),A$(Z,5),A$(Z,6),A$(Z,7)
- 3520 NEXT Z
- 3530 CLOSE
- 3540 GOTO 300 'start
- 3550 '
- 3560 '.....change text to capital letters
- 3570 FOR U=1 TO LEN(I$)
- 3580 V=ASC(MID$(I$,U,1))
- 3590 IF V>96 AND V<123 THEN MID$(I$,U,1)=CHR$(V-32)
- 3600 NEXT U
- 3610 RETURN
- 3620 '
- 3630 '.....inputs
- 3640 INPUT " ENTER: Call sign......................";I$:GOSUB 3560
- 3650 GOSUB 3990:RETURN
- 3660 '
- 3670 LINE INPUT " ENTER: Location (town or area)........?";I$:GOSUB 3560
- 3680 IF LEN(I$)<=28 THEN 3740
- 3690 CL=CSRLIN-1:BEEP:COLOR 15,4
- 3700 PRINT " TOO MANY CHARACTERS - PLEASE ABBREVIATE!....press any key...."
- 3710 COLOR 7,0
- 3720 IF INKEY$=""THEN 3720
- 3730 VIEW PRINT CL TO 24:CLS:VIEW PRINT:LOCATE CL:GOTO 3670
- 3740 GOSUB 3990:RETURN
- 3750 '
- 3760 INPUT " ENTER: Repeater OUTPUT frequency......";I$
- 3770 IF LEN(I$)<7 THEN I$=I$+"0":GOTO 3770
- 3780 GOSUB 3990:RETURN
- 3790 '
- 3800 INPUT " ENTER: Repeater input ( + or - )......";I$
- 3810 I$=I$+"600"
- 3820 IF LEFT$(I$,1)="+"OR LEFT$(I$,1)="-"THEN 3840
- 3830 LOCATE CSRLIN-1:PRINT STRING$(80,32);:LOCATE CSRLIN-1:GOTO 3800
- 3840 GOSUB 3990:RETURN
- 3850 '
- 3860 Z=N 'calculate input frequency
- 3870 I=VAL(A$(Z,4))/10^3+VAL(A$(Z,3)) 'output frequency
- 3880 Z$=STR$(I)
- 3890 I$=RIGHT$(Z$,LEN(Z$)-1) 'offset
- 3900 IF LEN(I$)<>7 THEN I$=I$+"0":GOTO 3900
- 3910 RETURN 'input frequency
- 3920 '
- 3930 INPUT " ENTER: Latitude (minus if south)......";I$
- 3940 GOSUB 3990:RETURN
- 3950 '
- 3960 INPUT " ENTER: Longitude (minus if west)......";I$
- 3970 GOSUB 3990:RETURN
- 3980 '
- 3990 LOCATE CSRLIN-1:PRINT STRING$(7,32)
- 4000 LOCATE CSRLIN-1,40:PRINT " ";I$
- 4010 RETURN
- 4020 '
- 4030 '.....new listing
- 4040 N=N+1
- 4050 PRINT " NEW LISTING"
- 4060 PRINT UL$;
- 4070 FOR X=1 TO 7
- 4080 ON X GOSUB 3640,3670,3760,3800,3860,3930,3960
- 4090 A$(N,X)=I$
- 4100 NEXT X
- 4110 CLS
- 4120 Z=N
- 4130 GOTO 6020
- 4140 '
- 4150 '.....sort
- 4160 VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
- 4170 PRINT " Press number in < > to SORT LISTINGS by:"
- 4180 PRINT UL$;
- 4190 PRINT " < 1 > Call Sign"
- 4200 PRINT " < 2 > Location"
- 4210 PRINT " < 3 > Output Frequency"
- 4220 Y$=INKEY$
- 4230 IF Y$="1"OR Y$="2"OR Y$="3"THEN 4250
- 4240 GOTO 4220
- 4250 IF Y$="1"THEN J=1:K=2:TOP$=" Call Sign"
- 4260 IF Y$="2"THEN J=2:K=1:TOP$=" Location"
- 4270 IF Y$="3"THEN J=3:K=1:TOP$=" Output Frequency"
- 4280 '
- 4290 VIEW PRINT 3 TO 24:CLS:VIEW PRINT
- 4300 GOSUB 240:COLOR 7,0 'sorting notice
- 4310 SN=N:SM=SN
- 4320 SM=INT(SM/2):IF SM=0 THEN 4430
- 4330 SK=SN-SM:SJ=1
- 4340 SI=SJ
- 4350 SL=SI+SM
- 4360 IF A$(SI,J)+A$(SI,K)<=A$(SL,J)+A$(SL,K) THEN 4410
- 4370 FOR X=1 TO 7
- 4380 SWAP A$(SI,X),A$(SL,X)
- 4390 NEXT X
- 4400 SI=SI-SM:IF SI>0 THEN 4350
- 4410 SJ=SJ+1:IF SJ>SK THEN 4320
- 4420 GOTO 4340
- 4430 RETURN
- 4440 '
- 4450 '.....screen display
- 4460 VIEW PRINT 3 TO 24:CLS:VIEW PRINT
- 4470 LOCATE 1,18:PRINT N;"listings in order of";TOP$
- 4480 LOCATE 3
- 4490 PRINT " Callsign";TAB(21);"Location";
- 4500 PRINT TAB(41);"Output Offset Input Lat. Long."
- 4510 PRINT UL$;
- 4520 LIN=4 'line no.
- 4530 '
- 4540 FOR Z=1 TO N 'start loop
- 4550 LIN=LIN+1
- 4560 IF LIN<25 THEN 4620
- 4570 '
- 4580 LOCALE=1:GOSUB 7550
- 4590 LIN=1
- 4600 COLOR 7,0:CLS
- 4610 '
- 4620 GOSUB 4820 'determine NEWS suffix
- 4630 PRINT TAB(2);A$(Z,1); 'call sign
- 4640 PRINT TAB(11);A$(Z,2); 'location
- 4650 PRINT STRING$(29-LEN(A$(Z,2)),".");
- 4660 PRINT TAB(41);USING "###.###";VAL(A$(Z,3)); 'output
- 4670 PRINT TAB(50);USING "+###";VAL(A$(Z,4)); 'offset
- 4680 I=VAL(A$(Z,3))+VAL(A$(Z,4))*10^-3 'input
- 4690 Z$=STR$(I)
- 4700 I$=RIGHT$(Z$,LEN(Z$)-1) 'offset
- 4710 IF LEN(I$)<7 THEN I$=I$+"0":GOTO 4710
- 4720 A$(Z,5)=I$
- 4730 PRINT TAB(56);USING "###.###";VAL(A$(Z,5)); 'input
- 4740 IF Z1*Z2=0 THEN 4770
- 4750 PRINT TAB(65);USING U5$;ABS(Z1);:PRINT Z1$; 'latitude
- 4760 PRINT TAB(73);USING U5$;ABS(Z2);:PRINT Z2$; 'longitude
- 4770 IF LIN<24 THEN PRINT ""
- 4780 NEXT Z
- 4790 GOSUB 7550 'screen dump
- 4800 GOTO 3480 'save & return to menu
- 4810 '
- 4820 '.....determine NSEW suffix
- 4830 E$=CHR$(248)
- 4840 Z1=VAL(A$(Z,6)):IF Z1<0 THEN Z1$=E$+"S"ELSE Z1$=E$+"N"
- 4850 Z2=VAL(A$(Z,7)):IF Z2<0 THEN Z2$=E$+"W"ELSE Z2$=E$+"E"
- 4860 RETURN
- 4870 '
- 4880 '.....menu return
- 4890 CLS
- 4900 PRINT:PRINT " Nothing starting with ";I$;" on file...."
- 4910 PRINT:PRINT " Press SPACE BAR to return to Menu
- 4920 Z$=INKEY$:IF Z$=" "THEN 300
- 4930 GOTO 4920
- 4940 '
- 4950 '.....find listing
- 4960 LOCATE 1
- 4970 PRINT " Press number in < > to find listing by:"
- 4980 PRINT UL$;
- 4990 PRINT " < 1 > CALL SIGN"
- 5000 PRINT " < 2 > LOCATION"
- 5010 PRINT " < 3 > OUTPUT FREQUENCY"
- 5020 K$=INKEY$
- 5030 IF K$="1"THEN CLS:F1$="CALL SIGN":GOTO 5080
- 5040 IF K$="2"THEN CLS:F1$="LOCATION":GOTO 5080
- 5050 IF K$="3"THEN CLS:F1$="OUTPUT FREQUENCY":GOTO 5080
- 5060 GOTO 5020
- 5070 '
- 5080 '.....find listing
- 5090 LOCATE 1
- 5100 PRINT " ENTER: First few characters in ";F1$;" ";:INPUT I$
- 5110 GOSUB 3560 'capitalize
- 5120 CLS
- 5130 LOCATE 24,35:PRINT " SEARCHING...";
- 5140 LOCATE 1
- 5150 L=LEN(I$):F=0
- 5160 K=VAL(K$)
- 5170 FOR Z=1 TO N
- 5180 IF LEFT$(A$(Z,K),L)<>I$ THEN 5300
- 5190 F=F+1
- 5200 F$(F,2)=STR$(Z)
- 5210 F$(F,1)=A$(Z,1)
- 5220 IF A$(Z,2)<>""THEN F$(F,1)=F$(F,1)+", "+A$(Z,2)
- 5230 IF F$(F,1)+F$(F,2)=F$(F-1,1)+F$(F-1,2)THEN F=F-1:GOTO 5300
- 5240 IF F<26 THEN 5300
- 5250 CLS:BEEP:PRINT" LIST TOO LONG TO FIT THE SCREEN!"
- 5260 PRINT
- 5270 PRINT" Please enter an extra character or two for a shorter list."
- 5280 PRINT
- 5290 GOTO 5100
- 5300 NEXT Z:IF F=0 THEN 4880
- 5310 CLS:IF F=1 THEN Z=VAL(F$(F,2)):GOTO 5520
- 5320 '
- 5330 PRINT F1$;"S starting with ";
- 5340 COLOR 0,7:PRINT " ";I$;" ":COLOR 7,0
- 5350 PRINT UL$;
- 5360 CF=CINT(F/2)
- 5370 FOR Z=1 TO CINT(F/2)
- 5380 PRINT "(";CHR$(96+Z);") ";F$(Z,1);TAB(41);
- 5390 PRINT "(";CHR$(96+CF+Z);") ";F$(Z+CF,1)
- 5400 NEXT Z
- 5410 IF F/2<>INT(F/2)THEN LOCATE CSRLIN-1,41:PRINT STRING$(39,32)
- 5420 PRINT UL$;
- 5430 LIN=CSRLIN
- 5440 PRINT " Press letter in ( ) to select listing or <0> to return to menu"
- 5450 Z$=INKEY$:IF Z$=""THEN 5450
- 5460 IF Z$="0"THEN 3300
- 5470 Z=ASC(Z$)-96
- 5480 IF Z>=1 AND Z<=F THEN Y=Z:Z=VAL(F$(Y,2)):CLS:GOTO 5510
- 5490 GOTO 5450
- 5500 '
- 5510 '.....display listing
- 5520 GOSUB 5750
- 5530 PRINT " Press number in ( ) to:"
- 5540 PRINT UL$;
- 5550 IF POSN=1 THEN POSN$="centre of the radar screen"
- 5560 IF POSN=2 THEN POSN$="repeater blip on the radar screen"
- 5570 IF POSN=3 THEN POSN$="location of the BASE STATION"
- 5580 IF FAR$=""THEN PRINT :GOTO 5610
- 5590 PRINT " ( 1 ) SELECT this listing as the ";POSN$
- 5600 IF FAR$<>""THEN 5630
- 5610 PRINT " ( 2 ) EDIT Listing
- 5620 PRINT " ( 3 ) DELETE Listing
- 5630 PRINT UL$;
- 5640 PRINT " ( 0 ) RETURN to menu
- 5650 Z$=INKEY$
- 5660 IF FAR$=""THEN 5700
- 5670 IF Z$="1"AND(POSN=1 OR POSN=2)THEN CLS:GOTO 5900
- 5680 IF Z$="1"AND POSN=3 THEN CLS:GOTO 6510
- 5690 IF FAR$<>""THEN 5720
- 5700 IF Z$="2"THEN CLS:GOTO 6020
- 5710 IF Z$="3"THEN BEEP:PRINT:GOTO 6270
- 5720 IF Z$="0"THEN 300
- 5730 GOTO 5650
- 5740 '
- 5750 '.....print listing
- 5760 PRINT" Call sign...line 1: ";A$(Z,1)
- 5770 PRINT" Location....line 2: ";A$(Z,2)
- 5780 PRINT" Output......line 3: ";A$(Z,3)
- 5790 PRINT" Offset......line 4: ";A$(Z,4)
- 5800 PRINT" Input.......line 5: ";A$(Z,5)
- 5810 B=VAL(A$(Z,6)):IF B<0 THEN B$=E$+"S"ELSE B$=E$+"N"
- 5820 PRINT" Latitude....line 6: ";
- 5830 PRINT USING"###.#";ABS(B);:PRINT B$
- 5840 B=VAL(A$(Z,7)):IF B<0 THEN B$=E$+"W"ELSE B$=E$+"E"
- 5850 PRINT" Longitude...line 7: ";
- 5860 PRINT USING"###.#";ABS(B);:PRINT B$
- 5870 PRINT UL$;
- 5880 RETURN
- 5890 '
- 5900 '.....assign variables for Great Circle calculations
- 5910 P$(POSN)=A$(Z,1)
- 5920 IF A$(Z,2)<>""THEN P$(POSN)=P$(POSN)+", "+A$(Z,2)
- 5930 RPT$=A$(Z,1)
- 5940 XMT$=A$(Z,3)
- 5950 SET$=A$(Z,4)
- 5960 RCV$=A$(Z,5)
- 5970 LA(POSN)=VAL(A$(Z,6))
- 5980 LO(POSN)=VAL(A$(Z,7))
- 5990 GOTO 10
- 6000 '
- 6010 '.....edit menu
- 6020 GOSUB 5750:PRINT " Press number in ( ) to:"
- 6030 PRINT UL$;
- 6040 FOR Y=1 TO 7
- 6050 IF Y<>5 THEN 6080
- 6060 PRINT " ( Line 5 changes automatically with any change in ";
- 6070 PRINT "line 3 and/or line 4 )":GOTO 6080
- 6080 PRINT " (";Y;") Change Line";Y
- 6090 NEXT Y
- 6100 PRINT UL$;
- 6110 PRINT " ( 0 ) ACCEPT as is"
- 6120 PRINT
- 6130 Z$=INKEY$:Q=VAL(Z$):IF Q<0 OR Q>7 THEN 6220
- 6140 IF Z$="1"THEN GOSUB 3640:A$(Z,1)=I$:CLS:GOTO 6010
- 6150 IF Z$="2"THEN GOSUB 3670:A$(Z,2)=I$:CLS:GOTO 6010
- 6160 IF Z$="3"THEN GOSUB 3760:A$(Z,3)=I$:GOSUB 3870:A$(Z,5)=I$:CLS:GOTO 6010
- 6170 IF Z$="4"THEN GOSUB 6230:A$(Z,4)=I$:GOSUB 3870:A$(Z,5)=I$:CLS:GOTO 6010
- 6180 IF Z$="5"THEN 6130
- 6190 IF Z$="6"THEN GOSUB 3930:A$(Z,6)=I$:CLS:GOTO 6010
- 6200 IF Z$="7"THEN GOSUB 3960:A$(Z,7)=I$:CLS:GOTO 6010
- 6210 IF Z$="0"THEN CLS:GOSUB 4290:GOTO 3480 'sort & save
- 6220 GOTO 6130
- 6230 INPUT " ENTER: Repeater input ( +nnn or -nnn )......";I$
- 6240 IF LEN(I$)<4 THEN I$=I$+"0":GOTO 6240
- 6250 RETURN
- 6260 '
- 6270 '.....delete listing
- 6280 BEEP:COLOR 0,7
- 6290 PRINT " Are you SURE you want to delete this file? (y/n) "
- 6300 COLOR 7,0
- 6310 Z$=INKEY$
- 6320 IF Z$="y"THEN 6350
- 6330 IF Z$="n"THEN CLS:GOTO 5510
- 6340 GOTO 6310
- 6350 CLS:PRINT " LISTING DELETED":FOR X=Z TO N:FOR Y=1 TO 7
- 6360 A$(X,Y)=A$(X+1,Y):NEXT Y:NEXT X:N=N-1:GOTO 3480 'save data
- 6370 '
- 6380 '.....ACS, ASN 'GOSUB HERE TO GET ASN/ACS
- 6390 IF Z=0 THEN RC=PI/2:GOTO 6420 'Z=VALUE FROM PROGRAM
- 6400 IF Z=1 THEN RC=0:GOTO 6420
- 6410 RC=-ATN(Z/SQR(1-Z^2))+PI/2 'RC=ANGLE IN RADIANS IF Z=COS
- 6420 RS=PI/2-RC 'RS=ANGLE IN RADIANS IF Z=SIN
- 6430 RETURN
- 6440 '
- 6450 '.....repeater range
- 6460 VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
- 6470 PRINT " Press any key to select location of BASE STATION"
- 6480 POSN=3:IF INKEY$=""THEN 6480
- 6490 CLS:GOTO 4950 'select hub station
- 6500 '
- 6510 '.....Z=file location of hub station
- 6520 LAH=VAL(A$(Z,6))*PI/180 'latitude of hub station
- 6530 LOH=VAL(A$(Z,7))*PI/180 'longitude of hub station
- 6540 '
- 6550 PRINT " ENTER: Maximum range (";UM$;") of base station";:INPUT KM
- 6560 KM=KM*UM
- 6570 '
- 6580 '.....compile, sort & print
- 6590 GOSUB 240 'sorting notice
- 6600 COLOR 7,0:LOCATE 1
- 6610 J=0 'reset counter
- 6620 FOR Y=1 TO N
- 6630 LAR=VAL(A$(Y,6))*PI/180 'latitude of repeater
- 6640 LOR=VAL(A$(Y,7))*PI/180 'longitude of repeater
- 6650 IF(LAH=LAR)AND(LOH=LOR)THEN DIS=0:GOTO 6710
- 6660 '
- 6670 D1=SIN(LAH)*SIN(LAR)+COS(LAH)*COS(LAR)*COS(LOR-LOH) 'D1=cos d2
- 6680 '
- 6690 D2=ATN(D1/SQR(-D1*D1+1))+PI/2 'distance angle in radians
- 6700 DIS=CINT(20000-D2*10^4/PI*2) 'distance in kilometers
- 6710 IF DIS>KM THEN 7120 'skip - out of range
- 6720 '.....bearing
- 6730 IF(LAH=LAR)AND(LOH=LOR)THEN CD=-1:GOTO 6840
- 6740 IF(LOH=LOR)AND(LAH<LAR)THEN CD=0:GOTO 6810
- 6750 IF(LOH=LOR)AND(LAH>LAR)THEN CD=180:GOTO 6810
- 6760 C1=(SIN(LAR)-SIN(LAH)*D1)/(COS(LAH)*SIN(D2)) 'bearing formula
- 6770 CR=ATN(C1/SQR(-C1*C1+1))+PI/2 'bearing in radians
- 6780 CD=CINT(CR*180/PI)
- 6790 IF LOH>LOR THEN CD=180+CD
- 6800 IF LOH<LOR THEN CD=180-CD
- 6810 B1$=STR$(CD)
- 6820 IF LEN(B1$)<>4 THEN B1$=" "+B1$:GOTO 6820
- 6830 B$=B1$+"<UNK! {00F8}>"
- 6840 IF CD=-1 THEN B$=" - "
- 6850 B2$=" N "
- 6860 IF CD> 11.25 THEN B2$=" NNE"
- 6870 IF CD> 33.75 THEN B2$=" NE"
- 6880 IF CD> 56.25 THEN B2$=" ENE"
- 6890 IF CD> 78.75 THEN B2$=" E "
- 6900 IF CD>101.25 THEN B2$=" ESE"
- 6910 IF CD>123.75 THEN B2$=" SE"
- 6920 IF CD>146.25 THEN B2$=" SSE"
- 6930 IF CD>168.75 THEN B2$=" S "
- 6940 IF CD>191.25 THEN B2$=" SSW"
- 6950 IF CD>213.75 THEN B2$=" SW"
- 6960 IF CD>236.25 THEN B2$=" WSW"
- 6970 IF CD>258.75 THEN B2$=" W "
- 6980 IF CD>281.25 THEN B2$=" WNW"
- 6990 IF CD>303.75 THEN B2$=" NW"
- 7000 IF CD>326.25 THEN B2$=" NNW"
- 7010 IF CD>348.75 THEN B2$=" N "
- 7020 IF CD=-1 THEN B2$=" - "
- 7030 B$=B$+B2$
- 7040 B3$=STR$(DIS)
- 7050 IF LEN(B3$)<5 THEN B3$=" "+B3$:GOTO 7050
- 7060 B$=B$+B3$
- 7070 B4$=A$(Y,1)
- 7080 IF LEN(B4$)<6 THEN B4$=B4$+" ":GOTO 7080
- 7090 B$=B$+" "+B4$+" "+(A$(Y,3))+" "+A$(Y,4)+" "+A$(Y,5)
- 7100 B$=B$+" "+A$(Y,2)
- 7110 J=J+1:B$(J)=B$:B$=""
- 7120 NEXT Y
- 7130 '
- 7140 '******START SORT******
- 7150 SN=J
- 7160 SM=SN
- 7170 SM=INT(SM/2):IF SM=0 THEN CLS:GOTO 7270
- 7180 SK=SN-SM:SJ=1
- 7190 SI=SJ
- 7200 SL=SI+SM
- 7210 IF LEFT$(B$(SI),4)<=LEFT$(B$(SL),4)THEN 7230 ELSE SWAP B$(SI),B$(SL)
- 7220 SI=SI-SM:IF SI>0 THEN 7200
- 7230 SJ=SJ+1:IF SJ>SK THEN 7170
- 7240 GOTO 7190
- 7250 '******SORT COMPLETED******
- 7260 '
- 7270 '.....display
- 7280 PRINT TAB(13);"Repeaters within";USING U3$;KM/UM;
- 7290 PRINT " ";UM$;" of ";A$(Z,2)
- 7300 PRINT TAB(13);"(in clockwise order from True North)"
- 7310 PRINT UL$;
- 7320 PRINT " Bearing";TAB(13);"Km";TAB(18);"Call";TAB(25);"Output";
- 7330 PRINT TAB(33);"Offset";TAB(41);"Input";TAB(49);"Location"
- 7340 PRINT UL$;
- 7350 LN=5
- 7360 FOR Z=1 TO J
- 7370 LN=LN+1
- 7380 PRINT B$(Z);
- 7390 IF LN <24 THEN PRINT "":GOTO 7410
- 7400 GOSUB 7550:LN=0:CLS:GOTO 7410
- 7410 NEXT Z
- 7420 PRINT "":GOSUB 7550
- 7430 GOTO 300 'start
- 7440 '
- 7450 '.....preface
- 7460 TX=7
- 7470 PRINT TAB(TX);
- 7480 PRINT "While this program is primarily a data base (which you can edit)"
- 7490 PRINT TAB(TX);
- 7500 PRINT "of your local repeaters, it also computes interesting information"
- 7510 PRINT TAB(TX);
- 7520 PRINT "and screen displays concerning them."
- 7530 RETURN
- 7540 '
- 7550 'HARDCOPY
- 7560 GOSUB 7670:LOCATE 25,2:COLOR 14,6
- 7570 PRINT " Press 1 to print screen, 2 to print screen & ";
- 7580 PRINT "advance paper, or 3 to continue.";:COLOR 7,0
- 7590 Z$=INKEY$:IF Z$="3"THEN GOSUB 7670:RETURN
- 7600 IF Z$="1"OR Z$="2"THEN GOSUB 7670:GOTO 7620
- 7610 GOTO 7590
- 7620 FOR QX=1 TO 24:FOR QY=1 TO 80
- 7630 LPRINT CHR$(SCREEN(QX,QY));
- 7640 NEXT QY:NEXT QX
- 7650 IF Z$="2"THEN LPRINT CHR$(12)
- 7660 GOTO 7560
- 7670 LOCATE 25,1:PRINT STRING$(80,32);:RETURN
-